package threadLock.threadBasics;

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * 使用队列来模拟 线程的等待和唤醒
 * 生产者 生产数据 消费者 消费数据
 * 生产者判断队列满了等待wait 生产者放入数据 使用notify通知消费者
 * 消费者相反 队列为空等待 消费数据之后 通知生产者
 */
public class waitNotifyThread {
    private static Integer maxSize = 10;
    private volatile static Queue<Integer> queue = new ArrayBlockingQueue<>(10);

    /**
     * 生产者
     * @param element 模拟生产元素
     */
    public void producer(int element) throws InterruptedException {
        synchronized (queue){
            while (queue.size() == maxSize){
                queue.wait();
            }
            queue.add(element);
            System.out.println("生产元素: "+element);
            queue.notifyAll();
        }
    }

    /**
     * 消费者
     */
    public void consumer() throws InterruptedException {
        synchronized (queue){
            while (queue.isEmpty()){
                queue.wait();
            }
            System.out.println("消费元素: "+queue.remove());
            queue.notifyAll();
        }
    }
}
